/*
 * @Author: DaHuaZhuXi
 * @Date: 2020-11-16 10:18:24
 * @LastEditTime: 2020-12-03 19:46:29
 * @LastEditors: DaHuaZhuXi
 * @Description: 通用服务功能
 */
import axios from 'axios';
import Vue from 'vue';
import { ElLoadingComponent, CallServiceParam } from './interface';

// 重定向页面
function reload(msg: string) {
  // sessionStorage.removeItem('user');
  // sessionStorage.removeItem('user_id');
  // sessionStorage.removeItem('alarmsEvents');

  // eslint-disable-next-line no-alert
  alert(msg);
  window.location.reload();
}

// 等待
let loading: ElLoadingComponent | null = null;

/**
 * 调用服务
 * @param {string} method 方法
 * @param {string} cluster 接口分组
 * @param {string} url URL后部
 * @param {object} data 数据
 * @param {Function} success 成功回调
 * @param {Function} exception 异常回调
 */
export function callService(param: CallServiceParam) {
  axios({
    method: param.method,
    url: process.env.VUE_APP_API_URL + param.url,
    data: param.data,
    headers: {
      token: '',
    },
  }).then((response) => {
    switch (Number(response.data.code)) {
      case 200:
        param.success(response.data.data);
        break;
      case 20104:
        param.exception('部分服务升级中，请稍后访问');
        break;
      case 20103:
        if (sessionStorage.getItem('user') != null) { // 必须保留此判断，否则多次弹窗
          reload('您的权限发生了变更或无权访问，请重新登录');
        }
        break;
      case 20101: // token超时
        if (sessionStorage.getItem('user') != null) { // 必须保留此判断，否则多次弹窗
          reload('用户超时，请重新登录');
        } else {
          // param.exception(response.data.msg);
        }
        break;
      case 40401: // 空数据情况
        param.success(response.data.data);
        break;
      case 404: // 空数据情况
        param.success(response.data.data);
        break;
      case 10002:
        param.exception(response.data.msg);
        break;
      default:
        throw response.data.msg;
    }
  }).catch((error) => {
    // console.log("主动中断请求："+ axios.isCancel(error));
    if (axios.isCancel(error)) return;
    param.exception(error);
  });
}

/**
 * 开始等待
 * @param {object} context 上下文
 */
export function beginWait(context: Vue) {
  loading = context.$loading({
    lock: true,
    spinner: 'el-icon-loading',
    background: 'rgba(0, 0, 0, 0.1)',
  });
}

/**
 * 结束等待
 */
export function endWait() {
  if (!loading) return;
  loading.close();
}

// 提示

/**
 * 提示成功
 * @param {object} context 上下文
 * @param {string} msg 信息
 * @param {int} duration 显示时间，默认3000ms，0为不关闭
 */
export function promptSuccess(context: Vue, msg: string, duration?: number) {
  const $duration = duration === undefined ? 3000 : duration;
  context.$message({
    showClose: true,
    message: msg,
    type: 'success',
    offset: 80,
    duration: $duration,
  });
}

/**
 * 提示失败
 * @param {object} context
 * @param {string} msg 信息
 * @param {int} duration 显示时间，默认3000ms，0为不关闭
 */
export function promptError(context: Vue, msg: string, duration?: number) {
  const $duration = duration === undefined ? 3000 : duration;
  context.$message({
    showClose: true,
    message: msg,
    type: 'error',
    offset: 80,
    duration: $duration,
  });
}

/**
 * 提示警告
 * @param {object} context
 * @param {string} msg 信息
 * @param {int} duration 显示时间，默认3000ms，0为不关闭
 */
export function promptWarn(context: Vue, msg: string, duration?: number) {
  const $duration = duration === undefined ? 3000 : duration;
  context.$message({
    showClose: true,
    message: msg,
    type: 'warning',
    offset: 80,
    duration: $duration,
  });
}

type Obj = {[k: string]: unknown};

/**
 * 对象转换为url参数字符串
 * @param {object} obj 对象
 */
export function objToUrlParam(obj: object) {
  if (!obj) return '';
  let str = '';
  Object.keys(obj).forEach((key: string) => {
    const val = (obj as Obj)[key];
    if (typeof val === 'string' && val.replace(/(^\s*)|(\s*$)/g, '') === '') {
      // 空内容不执行
    } else if (val instanceof Array) {
      val.forEach((e) => {
        str += `&${key}=${e}`;
      });
    } else {
      str += `&${key}=${val}`;
    }
  });

  return str;
}
